//#include<iostream>
//using namespace std;
//template<class T>
//class A {
//public:
//	T a; //成员变量
//	T b; //成员变量
//	//T Add(T a, T b); //成员函数的声明
//};
//int main()
//{
//	A<int> a; //int类型
//	A<double> b; //double类型
//	return 0;
//}

//#include<iostream>
//using namespace std;
//template<class T>
//class A {
//public:
//	A(T a, T b) :
//		a(0),
//		b(0){}
//
//	T a; //成员变量
//	T b; //成员变量
//	T Add(T a, T b); //成员函数的声明
//};
//int main()
//{
//	A<int> a(1, 2);
//	return 0;
//}


//#include<iostream>
//using namespace std;
//template<class T1,class T2>
//class A {
//public:
//	T1 a; //成员变量
//	T2 b; //成员变量
//	T1 Add(T1 a, T2 b)
//	{
//		return a + b;
//	}
//};
//int main()
//{
//	A<int, int> a; //创建模板类的一个对象a
//	A<int, double> b; //创建模板类的一个对象b
//	return 0;
//}

//#include<iostream>
//using namespace std;
//template<class T1, class T2>
//class A {
//public:
//	T1 a; //成员变量
//	T2 b; //成员变量
//	T1 Add(T1 a, T2 b)
//	{
//		return a + b;
//	}
//};
//int main()
//{
//	A<int, int>* a = new A<int, int>;
//	A<int, double>* b = new A<int, double>;
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//template<class T>
//class A {
//public:
//	T a; //成员变量
//	T b; //成员变量
//	T Add(T a, T b)
//	{
//		return a + b;
//	}
//};
//int main()
//{
//	//A<int> a;
//
//	//a.Add(1, 1.2); 
//	//此处不报错，因为在创建对象a时已经指定T是int类型，
//	//当Add()函数模板实例化时也会实例化出一个int类型的函数，它会自动将double类型的1.2转换为int类型的1。
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	template<class T>
//	class A {
//	public:
//		T a;
//		T b;
//	};
//	return 0;
//}

//#include<iostream>
//using namespace std;
//
//template<class T>
//class A {
//public:
//	T a;
//	int T;
//};
//
//int main()
//{
//	A<int> a;
//	return 0;
//}

#include<iostream>
using namespace std;
template<class T>
class A {
public:
	T a;
	T b;
	T Add(T a, T b);
};

////在类模板外部定义成员函数
//template<class T>
//T A<T>::Add(T a, T b)
//{
//	return a + b;
//}
//int main()
//{
//	A<int> a;
//	cout << a.Add(1, 2);
//	return 0;
//}

#include<iostream>
using namespace std;
//类模板
template<class T>
class Stack {
public:
	Stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = 0;
	}
	~Stack()
	{
		delete[] _array;
		_array = nullptr;
		_capacity = _size = 0;
	}
	void Push(const T& data);
	void Pop();
	bool empty()
	{
		return _size == 0;
	}
private:
	T* _array;
	size_t _capacity;
	size_t _size;
};

template<class T>
void Stack<T>::Push(const T& data)
{
	if (_size >= _capacity)
	{
		T* tmp = (T*)realloc(_array, sizeof(T) * _capacity * 2);
		if (tmp == nullptr) {
			perror("扩容失败");
			exit(1);
		}
		_array = tmp;
		_capacity *= 2;
	}
	_array[_size++] = data;
}

template<class T>
void Stack<T>::Pop()
{
	if (_size)
	{
		_size--;
	}
}

int main()
{
	// Stack是类名，Stack<int>才是类型
	Stack<int> st1; //int
	Stack<double> st2; //double

	return 0;
}